package com.atguigu.yygh.user.controller;

import com.alibaba.fastjson.JSONObject;
import com.atguigu.yygh.common.helper.JwtHelper;
import com.atguigu.yygh.common.result.R;
import com.atguigu.yygh.model.user.UserInfo;
import com.atguigu.yygh.user.service.UserInfoService;
import com.atguigu.yygh.user.utils.ConstantPropertiesUtil;
import com.atguigu.yygh.user.utils.HttpClientUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.util.HashMap;
import java.util.Map;

/**
 * @description: 生成二维码的接口
 * @author: 化一帆
 * @date: 2022/12/5 9:13
 * @version: v1.0
 */
@Controller
@RequestMapping("/api/user/wx")
public class WxApiController {
    @Autowired
    private UserInfoService userInfoService;

    @ResponseBody
    @RequestMapping("getLoginParam")
    public R getLoginParam() throws UnsupportedEncodingException {
        HashMap<String, Object> map = new HashMap<>();

        map.put("appid", ConstantPropertiesUtil.APP_ID);
        map.put("scope","snsapi_login");
        map.put("redirectUri", URLEncoder.encode(ConstantPropertiesUtil.REDIRECT_URL,"utf-8"));//重定向地址，需要进行UrlEncode
        map.put("state",System.currentTimeMillis());
        return R.ok().data(map);
    }

    /**
     * @description:  扫码之后需要跳转的页面
     * 在手机端点击确认之后，会自动的重定向到该接口，并且携带微信用户的临时的票据code【封装了微信用户的信息】
     * @author 化一帆
     * @date 2022/12/5 16:41
     */
    @GetMapping("callback")
    public String callback(String code){//微信端的临时的票据，封装微信端的信息

        //1、根据临时票据code，补全接口的路径【通过此接口获取微信用户的详细信息】

        String url = "https://api.weixin.qq.com/sns/oauth2/access_token?" +
                "appid=" + ConstantPropertiesUtil.APP_ID +
                "&secret=" + ConstantPropertiesUtil.APP_SECRET +
                "&code=" + code +
                "&grant_type=authorization_code";



        //2.发起请求调用该接口
        try {
           String s = HttpClientUtils.get(url);//json字符串

            JSONObject jsonObject = JSONObject.parseObject(s);

            String openid = jsonObject.getString("openid");
            String access_token = jsonObject.getString("access_token");

            //从userInfo表中查询opinid对应的用户是否存在【用户是否绑定微信】
            UserInfo userInfo=userInfoService.getUserInfoByOpenId(openid);

            //如果此用户之前为绑定过微信，进行为微信的绑定
            if(userInfo==null){
                //调用接口查询微信昵称
                String url_userinfo = "https://api.weixin.qq.com/sns/userinfo?" +
                        "access_token=" + access_token +
                        "&openid="+openid;

                String s1 = HttpClientUtils.get(url_userinfo);
                JSONObject jsonObject_userinfo = JSONObject.parseObject(s1);
                String nickname = jsonObject_userinfo.getString("nickname");

                UserInfo userInfo1= new UserInfo();
                userInfo1.setOpenid(openid);
                userInfo1.setNickName(nickname);
                userInfoService.save(userInfo1);
            }
            //参数1：name=右上角显示的
            String name = userInfo.getName();
            if(StringUtils.isEmpty(name)){
                name = userInfo.getNickName();
                if(StringUtils.isEmpty(name)){
                    name = userInfo.getPhone();
                }
            }
            //参数2：jwt令牌
            String token = JwtHelper.createToken(userInfo.getId(),name);

            //参数3：openid，如果当前用户的手机号为空（需要绑定手机号），传递openid
            return "redirect:http://localhost:3000/weixin/callback?" +
                    "name="+URLEncoder.encode(name,"utf-8")  +"&" +
                    "token="+token + "&" +
                    "openid="+  (StringUtils.isEmpty(userInfo.getPhone())==true?userInfo.getOpenid():"") ;
                //重定向到前端的一个页面weixin/callback页面，并且传递了三个参数


        } catch (Exception e) {
            e.printStackTrace();
        }



        //1.判断当前的微信用户是否在数据库中存在【openid】

        //1.将当前的用户的openid取出，自动注册，（openid+nick_name）
        //(1)判断当前的微信用户是否在数据库中存在【openid】



        return "";
    }
}

